package com.ardf.mapper;

import com.ardf.entity.Athlete;
import com.ardf.entity.Batch;
import com.ardf.entity.Unit;
import com.ardf.entity.dto.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * Mapper 接口
 * </p>
 *
 * @author ShiYunHao
 * @since 2025-01-06
 */
public interface BatchMapper extends BaseMapper<Batch> {
    /**
     * 搜索接力查询
     */
    Page<BatchTableRelayDto> searchAllRelay(Page<BatchTableRelayDto> page, @Param("projectId") Long projectId,
                                            @Param("searchAll") String searchAll);

    /**
     * 搜索个人查询
     */
    Page<BatchTablePersonDto> searchAllPerson(Page<BatchTablePersonDto> page, @Param("projectId") Long projectId,
                                              @Param("searchAll") String searchAll);

    /**
     * 获取同一项目参加的单位数（无单位除外）
     */
    Integer getUnitCountByProjectId(@Param("projectId") Long projectId);

    /**
     * 获取每个单位每个组的人数（无单位除外）
     */
    List<UGAthleteCountDto> getUnitGroupAthleteCountListByProjectId(@Param("projectId") Long projectId);

    /**
     * 同场竞赛的不同组别数(公开组除外)
     *
     * @param projectId
     * @return
     */
    Integer getGroupCountByProjectId(@Param("projectId") Long projectId);

    /**
     * 获取所有组别的id（无单位除外）
     */
    List<Long> getUnitIdListByProjectId(@Param("projectId") Long projectId);

    /**
     * 通过组别和单位id获取选手id
     *
     * @param groupId
     * @param unitId
     * @return
     */
    List<Long> getAthleteIdByGroupIdAndUnitId(@Param("groupId") Long groupId, @Param("unitId") Long unitId);

    /**
     * 获取公开组选手id
     *
     * @param projectId
     * @return
     */
    List<Long> getPublicGroupAthleteIdListByProjectId(@Param("projectId") Long projectId);

    /**
     * 获取TeamAthleteListDtos
     */
    List<TeamAthleteListDto> getTeamAthleteListDtosByProjectId(@Param("projectId") Long projectId);

    /**
     * 获取接力可调换信息
     */
    List<CanExchangeDto> getCanExchangeRelayDtos(@Param("projectId") Long projectId, @Param("teamId") Long teamId, @Param("athleteId") Long athleteId);

    /**
     * 获取个人赛可调换信息
     */
    List<CanExchangeDto> getCanExchangePersonDtos(@Param("projectId") Long projectId, @Param("athleteId") Long athleteId,
                                                  @Param("groupId") Long groupId, @Param("unitId") Long unitId);

    /**
     * 按批次号导出批次表
     */
    List<DownloadBatchBySequenceDto> getAllBySequence(@Param("projectId") Long projectId);

    /**
     * 通过项目id获得所有单位（包括无单位）
     *
     * @param projectId
     * @return
     */
    List<Unit> getUnitByProjectId(@Param("projectId") Long projectId);

    /**
     * 按单位导出接力批次表
     */
    List<DownloadRelayBatchByUnitDto> getAllRelayByUnit(@Param("projectId") Long projectId, @Param("unitId") Long unitId);

    /**
     * 按单位导出个人批次表
     */
    List<DownloadPersonBatchByUnitDto> getAllPersonByUnit(@Param("projectId") Long projectId, @Param("unitId") Long unitId);

    /**
     * 根据projectId获取所有的参赛选手
     *
     * */
    List<Athlete> getAthleteByProjectId(@Param("projectId") Long projectId);
}
